package org.jeecg.common.util;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;

import java.beans.PropertyEditorSupport;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 类描述：节假日工具类
 */
public class HolidayUtils extends PropertyEditorSupport {

    //假日名称静态字段
    public final static String NEW_YEAR_DAY = "元旦节";
    public final static String CHINESE_NEW_YEAR_GREGORIAN_FESTIVAL = "春节";
    public final static String PURE_BRIGHTNESS_FESTIVAL = "清明节";
    public final static String LABOR_DAY = "劳动节";
    public final static String DRAGON_BOAT_GREGORIAN_FESTIVAL = "端午节";
    public final static String MID_AUTUMN_GREGORIAN_FESTIVAL = "中秋节";
    public final static String NATIONAL_DAY = "国庆节";

    //天行API接口，https://www.tianapi.com/console/
    public final static String key = "ccc5eec00fbb1623dd8f5bab05546993";//api密钥
    public final static String date = "";//查询日期或日期范围
    public final static int type = 1;//查询类型，0批量、1按年、2按月、3范围
    public final static int mode = 0;//查询模式，为1返回国际各类特殊纪念日信息

    //查询当前年份内的所有节假日信息 URL
    public final static String httpUrl = "http://api.tianapi.com/jiejiari/index?key="+key+"&type=1";


    /**
     * 查询当前年份内的所有节假日信息
     * @return 返回结果
     */
    public static String getHoliday() {
        BufferedReader reader = null;
        String result = null;
        StringBuffer sbf = new StringBuffer();

        try {
            URL url = new URL(httpUrl);
            HttpURLConnection connection = (HttpURLConnection) url
                    .openConnection();
            connection.setRequestMethod("GET");
            InputStream is = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String strRead = null;
            while ((strRead = reader.readLine()) != null) {
                sbf.append(strRead);
                sbf.append("\r\n");
            }
            reader.close();
            result = sbf.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    /** 返回数据格式 */
//    Response Body:
//    {
//        "code": 200,
//            "msg": "success",
//            "newslist": [
//        {
//            "holiday": "1月1号",
//                "name": "元旦节",
//                "vacation": "2022-01-01|2022-01-02|2022-01-03",
//                "remark": "",
//                "wage": "2022-01-01",
//                "start": 0,
//                "now": 0,
//                "end": 2,
//                "tip": "1月1日放假，共3天。",
//                "rest": "2021年12月30日和2021年12月31日请假两天，与周末连休可拼5天小长假。"
//        },
//        {
//            "holiday": "1月31号",
//                "name": "春节",
//                "vacation": "2022-01-31|2022-02-01|2022-02-02|2022-02-03|2022-02-04|2022-02-05|2022-02-06",
//                "remark": "2022-01-29|2022-01-30",
//                "wage": "2022-02-01|2022-02-02|2022-02-03",
//                "start": 0,
//                "now": 0,
//                "end": 6,
//                "tip": "1月31日至2月6日放假调休，共7天。1月29日（星期六）、1月30日（星期日）上班。",
//                "rest": "2022年1月29日和2022年1月30日请假两天，与春节一起可拼9天长假。"
//        },
//        {
//            "holiday": "4月5号",
//                "name": "清明节",
//                "vacation": "2022-04-03|2022-04-04|2022-04-05",
//                "remark": "2022-04-02",
//                "wage": "2022-04-05",
//                "start": 0,
//                "now": 0,
//                "end": 2,
//                "tip": "4月3日至5日放假调休，共3天。4月2日（星期六）上班。",
//                "rest": "2022年4月2日请假一天，与周末连休可拼4天长假。"
//        },
//        {
//            "holiday": "5月1号",
//                "name": "劳动节",
//                "vacation": "2022-04-30|2022-05-01|2022-05-02|2022-05-03|2022-05-04",
//                "remark": "2022-04-24|2022-05-07",
//                "wage": "2022-05-01",
//                "start": 0,
//                "now": 0,
//                "end": 4,
//                "tip": "4月30日至5月4日放假调休，共5天。4月24日（星期日）、5月7日（星期六）上班。",
//                "rest": "2022年5月5日至2022年5月7日请假三天，与周末连休可拼9天长假。"
//        },
//        {
//            "holiday": "6月3号",
//                "name": "端午节",
//                "vacation": "2022-06-03|2022-06-04|2022-06-05",
//                "remark": "",
//                "wage": "2022-06-03",
//                "start": 0,
//                "now": 0,
//                "end": 2,
//                "tip": "6月3日至5日放假，共3天。",
//                "rest": "2022年6月1日至2022年6月2日请假两天，与周末连休可拼5天小长假。"
//        },
//        {
//            "holiday": "9月10号",
//                "name": "中秋节",
//                "vacation": "2022-09-10|2022-09-11|2022-09-12",
//                "remark": "",
//                "wage": "2022-09-10",
//                "start": 0,
//                "now": 0,
//                "end": 2,
//                "tip": "9月10日至12日放假，共3天。",
//                "rest": "2022年9月8日至2022年9月9日请假两天，与周末连休可拼5天小长假。"
//        },
//        {
//            "holiday": "10月1号",
//                "name": "国庆节",
//                "vacation": "2022-10-01|2022-10-02|2022-10-03|2022-10-04|2022-10-05|2022-10-06|2022-10-07",
//                "remark": "2022-10-08|2022-10-09",
//                "wage": "2022-10-01|2022-10-02|2022-10-03",
//                "start": 0,
//                "now": 0,
//                "end": 6,
//                "tip": "10月1日至7日放假调休，共7天。10月8日（星期六）、10月9日（星期日）上班。",
//                "rest": "2022年10月8日至2022年10月9日请假两天，与周末连休可拼9天长假。"
//        }
//  ]
//    }

    /**
     * 判断指定日期是否为节假日或周末（不含调休）
     * @param day 格式： yyyy-MM-dd
     * @return 是返回true，否返回false
     */
    public static boolean isHolidayOrWeekend(String day){
        /**1、判断是否为周末*/
        int week = DateUtils.getWeekOfDate(day);
        if (week == 6 || week == 0) return true;

        /**2、判断是否为周末*/
        //获取所有节假日数据
        String holiday = HolidayUtils.getHoliday();
        if (oConvertUtils.isEmpty(holiday)) return false;
        JSONObject jsonObject = JSON.parseObject(holiday);
        if (oConvertUtils.isNotEmpty(jsonObject) && oConvertUtils.getInt(jsonObject.get("code"), 0) == 200) {
            JSONArray jsonArray = JSONArray.parseArray(oConvertUtils.getString(jsonObject.get("newslist")));
            if (oConvertUtils.listIsEmpty(jsonArray)) return false;
            for (Object obj : jsonArray) {
                JSONObject json = JSONObject.parseObject(oConvertUtils.getString(obj));
                String vacation = json.getString("vacation");//当前假期放假的日期
                if (oConvertUtils.isEmpty(vacation)) return false;
                if (vacation.indexOf(day) != -1) { //包含即当天为节假日
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 判断指定是工作日、周末还是节假日（含调休）
     * @param httpArg 格式： yyyyMMdd
     * @return 0：上班，1：周末，2：节假日
     */
    public static String request(String httpArg) {
        String httpUrl = "http://tool.bitefu.net/jiari/";
        BufferedReader reader = null;
        String result = null;
        StringBuffer sbf = new StringBuffer();
        httpUrl = httpUrl + "?d=" + httpArg;
        try {
            URL url = new URL(httpUrl);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("GET");
            connection.connect();
            InputStream is = connection.getInputStream();
            reader = new BufferedReader(new InputStreamReader(is, "UTF-8"));
            String strRead = null;
            while ((strRead = reader.readLine()) != null) {
                sbf.append(strRead);
                sbf.append("\r\n");
            }
            reader.close();
            result = sbf.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }


    public static void main(String[] args) {
//        System.out.println(isHolidayOrWeekend("2023-05-06"));
//        System.out.println(getHoliday());

        //判断指定是工作日 周末 还是节假日，0 上班 1周末 2节假日
        String jsonResult = HolidayUtils.request("20240407");
        System.out.println(jsonResult);

    }

}
